package com.study.springmvc.v9mvc.config;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;

//使用WebApplicationInitializer 替代web.xml
public class WebInitializer implements WebApplicationInitializer {
    public void onStartup(javax.servlet.ServletContext servletContext) throws ServletException {
        // 1.启动SpringMVC 容器 类注入到Spring中
        AnnotationConfigWebApplicationContext app = new AnnotationConfigWebApplicationContext();// 启动SpringMVC Web
        // 2.注入我们的springmvc 的配置文件
        app.register(MvcConfig.class);
        // 3. 将我们的DispatcherServlet 注入到 serlvet容器中
        ServletRegistration.Dynamic dynamic =
                servletContext.addServlet("dispatcher", new DispatcherServlet(app));
        // 4.填写url路径映射
        dynamic.setAsyncSupported(true); //开始异步 callable 支持
        dynamic.addMapping("/");
        dynamic.setLoadOnStartup(1);// 优先级最高表示 最早被加载

    }
    // 基本配置已经ok呢？ web.xml ？ 使用WebApplicationInitializer 替代web.xml
    //为什么这个类WebInitializer 不需要直接呢？ 能够自动的找到该类呢
    /**
     * 1.	Spring-Web依赖Jar包
     * SpringServletContainerInitializer 提供给SpringMVC实现初始化
     * 2.	HandlesTypes WebApplicationInitializer
     * 3.	WebInitializer继承WebApplicationInitializer
     * 4.	Servlet容器在启动的时候 WebInitializer
     */


    /**
     * 拦截器和过滤器都是基于Aop实现，能够对请求执行之前和之后实现拦截。
     * 过滤器是基于Servlet容器实现，对Web请求之前和之后实现拦截
     * 拦截器不需要依赖于Servlet、不仅可以实现Web请求还有其他方法拦截等。
     */


    /**
     * 消息 Request processing failed; nested exception is java.lang.IllegalStateException: Async support must be enabled on a servlet and for all filters involved in async request processing. This is done in Java code using the Servlet API or by adding "<async-supported>true</async-supported>" to servlet and filter declarations in web.xml.
     * 需要添加dynamic.setAsyncSupported(true); //开始异步 callable 支持
     */
}
